﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace hse_2013_tetris
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
        Brush[] br = {Brushes.White, Brushes.Orange, Brushes.Blue, Brushes.Red, Brushes.Green, Brushes.Chocolate,
            Brushes.Violet};
        Figures figure;
        Graphics gr;
        bool start = false;
        int width = 10;
        int height = 15;
        int zoom = 24;
        int[,] mas;
       
        private void MainForm_Load(object sender, EventArgs e)
        {
            pcrBox.Visible = false;
            btnStart.Visible = true;

        }
        /// <summary>
        /// Кнопка начала игры
        /// </summary>
        private void btnStart_Click(object sender, EventArgs e)
        {
             
            btnStart.Hide();
            start = true;
            mas = new int[width, height];
            figure = null;
            pcrBox.Visible = true;
            timer.Enabled = true;
        }
        /// <summary>
        /// Метод рисования эллипсов, из которых состоят поле и фигуры
        /// </summary>
        public void draw(int x, int y, int clr)
        {
            if (clr == 0 || x < 0 || x >= width || y < 0 || y >= height) return;
            gr.FillEllipse(br[clr],2 + x * zoom, 2 + y * zoom, 24, 24);
        }
        /// <summary>
        /// Заполнение массива
        /// </summary>
        public int get_mas(int x, int y)
        {
            if (x < 0 || x >= width || y >= height) return 1;
            if (y < 0) return 0;
            return mas[x, y];
        }
        /// <summary>
        /// Метод закрашивания элемента массива(поля) в рандомный цвет
        /// </summary>
        public void set_mas(int x, int y, int clr)
        {
            if (x < 0 || x >= width || y < 0 || y >= height) return;
            mas[x, y] = clr;
        }

        /// <summary>
        /// Проверка существования фигуры на поле
        /// </summary>
       public bool figure_exist()
        {
            int i, j;
            for (i = 0; i < 4; i++)
                for (j = 0; j < 4; j++)
                {
                    if (figure.pix[i, j] != 0 && get_mas(figure.x + i, figure.y + j) != 0)//условие существования фигуры
                        return false;
                }
            return true;
        }
        /// <summary>
        /// Метод падения фигуры
        /// </summary>
        public void figure_down()
        {
            figure.y++;//падение
            if (!figure_exist())
            {
                figure.y--;
                use_figure();
                figure = null;
            }
        }

        /// <summary>
        /// Рисование основных элементов, таких как поле и фигура
        /// </summary>
        public void pcrBox_Paint(object sender, PaintEventArgs e)
        {
            if (!start) return;
            gr = e.Graphics;
            gr.DrawRectangle(Pens.Black, new Rectangle(0, 0, 244, 364));
            gr.FillRectangle(Brushes.Bisque, new Rectangle(1, 1, 243, 363));
            //нарисовать поле
            int i, j;
            for (i = 0; i < width; i++)
                for (j = 0; j < height; j++)
                    draw(i, j, mas[i, j]);
            //нарисовать фигуру
            if (figure != null)
            {
                for (i = 0; i < 4; i++)
                    for (j = 0; j < 4; j++)
                        draw(figure.x + i, figure.y + j, figure.pix[i, j]);
            }
        }
        /// <summary>
        /// Основной метод:удаление строки,остановка фигуры
        /// </summary>
        public void use_figure()
        {
            int i, j;
            for (i = 0; i < 4; i++)
                for (j = 0; j < 4; j++)
                    if (figure.pix[i, j] != 0) set_mas(figure.x + i, figure.y + j, figure.pix[i, j]);//если матрица фигуры заполнена,то закрашиваем эту фигуру(на поле)
            bool[] lines = new bool[height];//линии
            for (i = 0; i < height; i++)
            {
                bool b = true;
                for (j = 0; j < width; j++)
                {
                    if (mas[j, i] == 0)
                    {
                        b = false;
                        break;
                    }
                }
                lines[i] = b;//строки,в которых находится фигура = true
            }

            int[,] eq = new int[width, height];
            int h = height;
            for (i = height - 1; i >= 0; i--)
            {
                if (lines[i]) continue;
                h--;//остановка
                for (j = 0; j < width; j++)
                {
                    eq[j, h] = mas[j, i];//удаление
                }
            }
            mas = eq;//перерисовка поля

        }

        /// <summary>
        /// Падение фигуры по таймеру,перерисовка формы и условие окончания игры
        /// </summary>
        private void timer_Tick(object sender, EventArgs e)
        {
            if (figure == null)
            {
                figure = new Figures();
                if (!figure_exist())
                {
                    timer.Enabled = false;
                    pcrBox.Hide();
                    MessageBox.Show("Игра окончена!\nВы проиграли!");
                    btnStart.Visible = true;
                }
            }
            figure_down();
            pcrBox.Refresh();
        }

        /// <summary>
        /// Перемещение фигуры по клавишам(стрелкам)
        /// </summary>
        private void MainForm_KeyDown(object sender, KeyEventArgs e)
        {
            if (figure == null) return;
            if (e.KeyCode == Keys.Left)
            {
                  figure.x -= 1;
                  if (!figure_exist())
                  figure.x += 1;   
            }
            else if (e.KeyCode == Keys.Right)
            { 
                  figure.x += 1;
                  if (!figure_exist())
                   figure.x -= 1;                
            }
            else if (e.KeyCode == Keys.Down)
            {
                figure.y += 1;
                if (!figure_exist())
                figure.y -= 1;
            }
            else if (e.KeyCode == Keys.Up)
            {
                figure.rotate();
                if (!figure_exist())
                {
                    for (int i = 0; i < 3; i++)
                        figure.rotate();
                }
            }
            pcrBox.Refresh();

        }

        /// <summary>
        /// Включение клавиш сдвига
        /// </summary>
        private void btnStart_KeyDown(object sender, KeyEventArgs e)
        {
            MainForm_KeyDown(sender, e);
        }
        
        }
        }
    
